package com.desyang.client.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.desyang.client.IOClient;
import com.desyang.common.message.Request;

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class ServiceProxy implements InvocationHandler {
    private String host;
    private int port;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 当调用代理对象方法时，实际调用的是invoke方法，这里对invoke方法进行重写
        // 构造请求对象
        Request request = Request.builder()
                        .serviceName(method.getDeclaringClass().getName())
                        .methodName(method.getName())
                        .args(args)
                        .argsType(method.getParameterTypes())
                        .build();
        // 调用网络通信模块，发送请求到服务端，并接收响应
        Object data = IOClient.sendRequest(host, port, request);

        return data;
    }

    @SuppressWarnings("unchecked")
    public <T> T getProxy(Class<T> clazz) {
        // 生成一个代理对象并返回
		return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[] { clazz }, this);
    }
}
